//
//  main.m
//  pthread
//
//  Created by admin on 2019/8/14.
//  Copyright © 2019 猫爷爷的酱醋茶. All rights reserved.
//

/*
 
 iOS中多线程的技术方案
    pthread -  跨平台、可移植
     a）一套通用的多线程API
     b）适用于Unix\Linux\Windows等系统
     c）C语言
     d）使用难度大，线程生命周期程序员来管理
     （几乎不用该方案）
 
 */

#import <Foundation/Foundation.h>
//C语言提供的方法 系统提供的头文件，使用<>
#import <pthread.h>

void *demoOne(void *prama);

void *demoTwo(void *prama);

void *demoThree(void *prama);

int main(int argc, const char * argv[])
{
    
    
    /*
     1.第一个参数：线程编号的地址
     2.第二个参数：线程的属性
     3.第三个参数：void * （*） void* - 线程要执行的函数地址，也就是函数名
     int * 代表指向int类型的指针，void * 代表指向任何类型的指针，有点像OC里的id
     4.第四个参数：要执行函数的参数
     
     返回值为int类型  0表示成功 非0表示失败  和以前的不同
     */
    
    //创建一个子线程
    pthread_t pthreadOne; //线程编号
    
    //线程要执行的函数没有参数
//    int result = pthread_create(&pthreadOne, NULL, demoOne, NULL);
    
    //线程要执行的函数有参数
//    char *name = "rose";//如果使用C语言的字符串直接可以传递
    
    //使用OC的字符串，把OC对象传递给C语言函数，需要桥接
    NSString *str = @"IOS开发者";
    
    int result = pthread_create(&pthreadOne, NULL, demoThree, (__bridge void *)(str));
    
    if (result == 0)
    {
        NSLog(@"线程创建成功");
    }else{
        NSLog(@"线程创建失败");
    }
    
    return 0;
}


void *demoThree(void *prama)
{
    //同样，C语言函数传递的值，也需要用__bridge桥接
    NSString *str = (__bridge NSString *)(prama);
    
    NSLog(@"猫爷爷的酱醋茶，%@,加油哈~ %@",str,[NSThread currentThread]);
    return NULL;
}

void *demoTwo(void *prama)
{
    //线程什么时候执行，都是不确定的
    //C语言字符串用%s输出
    NSLog(@"猫爷爷的酱醋茶，%s,加油哈~ %@",prama,[NSThread currentThread]);
    return NULL;
}


//多线程执行函数没有参数
void *demoOne(void *prama)
{
    //线程什么时候执行，都是不确定的
    NSLog(@"猫爷爷的酱醋茶，加油哈~ %@",[NSThread currentThread]);
    return NULL;
}
